--[[
    统一处理服务端玩家状态在游戏中，但由于客户端大退重登、托管离开导致没有对应界面环境的情况
]]--

local blaze = require "blaze"
local app = require "app"
local gamelib = require "club.threecard.gamelib"
local log = blaze.logging.get("reconnection")

local M = {}

local function resume_running()
    local player = app.kbe.player()
    if not player.resume_game then
        log.warn("已经在游戏里了，不需要用resume_game来恢复")
        gamelib.game_scene.enter()
        return
    end

    player:resume_game()
    :next(function()
        -- 恢复游戏成功，进入ingame界面
        gamelib.game_scene.enter()
    end, function(e)
        -- TODO:恢复游戏失败
        app.toast.show("恢复游戏失败")
    end)
end

-- 快速恢复游戏，通常在子游戏启动后立即调用
-- 仅当可恢复的游戏和当前游戏相同时恢复
function M.fast_resume()
    local active_game = app.store.avatar.state.active_game
    if not active_game or active_game == "" then
        -- 没有需要恢复的游戏
        return false
    end

    local current_game = app.store.game.state.package
    if current_game ~= active_game then
        -- 需要恢复另外一个游戏
        return false
    end

    resume_running()
    return true
end

-- 完整恢复游戏，通常在子游戏玩家即将进入房间前调用
-- 即使需要恢复的游戏为另外一个游戏，也会退出当前游戏后再拉起它
function M.resume()
    local active_game = app.store.avatar.state.active_game
    if not active_game or active_game == "" then
        -- 没有需要恢复的游戏
        return false
    end

    -- TODO:使用游戏的msgbox模块
    local current_game = app.store.game.state.package
    if current_game ~= active_game then
        -- 需要恢复另外一个游戏
        app.msgbox.show({
            content = app.i18n.text("room:continue game tip"),
            on_confirm = function()
                app.game.exit({
                    instant = true,
                    intent = "resume",
                    package = active_game
                })
            end,
            on_cancel = blaze.noop,
            cancelable = true
        })
        return true
    end

    app.msgbox.show({
        content = app.i18n.text("room:continue game tip"),
        on_confirm = resume_running,
        on_cancel = blaze.noop,
        cancelable = true
    })
    return true
end

return M